数据结构
XML格式的优点
能够以结构化XML格式获取Entrez记录并轻松提取基础数据,使用户能够提出现有分析软件无法解决的新问题。
XML的优点是许多信息都位于定义明确的数据层次结构中的特定位置。访问按名称提供的各个数据单元,例如:
|
|
需要匹配相同的通用模式,仅由元素名称不同。这比从长而复杂的字符串解析单位要简单得多:
|
|
XML的缺点是数据提取通常需要编程。但是EDirect依赖于XML值表示的通用模式来提供解释XML数据的简化方法。
将XML数据转换为表格形式
xtract函数使用命令行参数来指导XML数据的选择性转换为制表符分隔的表。 -pattern参数将结果划分为行,而将数据放入列中则由-element控制。一个简单的例子:
|
|
将打印当前查询中的记录数。
Xtract使用单独的参数进行元素选择,路径探索,条件处理和报告格式化,使用分而治之策略来控制数据转换。
元素选择查找每个指示项目的每次出现,在遇到它们时打印值。探索控制限制按上下文选择,一次呈现一个指定的对象。条件处理按内容过滤,要求存在(或不存在)特定数据值以便继续。最后,自定义格式可以覆盖默认输出的常规表格布局。
本节其余部分将讨论这种灵活方法的细节和分支。
提取参数
选择参数(-element,-first和-last)从指示的元素名称中提取和打印数据值:
|
|
探测参数(-pattern,-group,-block和-subset)将数据提取限制为XML的指定区域,一次访问一个所有相关对象。这为数据收集设置了上下文,消除了提供数据元素的完整路径的需要,并从“在哪里找到它”中提升为“寻找什么”的概念:
|
|
每个模式可以有多个组,每个组可以有多个块,每个块可以有多个子集。此设计允许嵌套探索复杂的分层数据,这些数据由命令行参数语句的线性链控制。
条件处理参数按对象名称和值(-if和-unless)或项目位置(-position)限制探索语句:
|
|
这些命令在探测参数后立即发出。
格式化参数(-ret,-tab,-sep,-pfx,-sfx和-def)允许对默认行/列表显示进行大量自定义:
|
|
并适用于后续的选择陈述。
(“\n”转义序列表示换行符,而“\t”指定制表符。)
XML文档摘要
Entrez为每条记录提供结构化XML格式的文档摘要。将查询管道化为“efetch -format docsum”:
|
|
将生成XML文档摘要集:
|
|
将文档摘要管道输出到:
|
|
将给出XML层次结构的缩进概述:
|
|
大纲视图提供了一个清晰,整洁的XML层次结构图,可用于设计适当的实际数据提取命令。从-outline输出复制并粘贴到xtract参数可以帮助避免印刷错误。从而:
|
|
返回PubMed标识符(PMID),第一作者姓名和文章标题:
|
|
使用xtract“-synopsis”而不是-outline显示每个元素的完整路径。将这些结果管道化为“sort-uniq-count”(见下文)会生成一个唯一路径计数表。
使用UNIX实用程序处理结果
许多UNIX实用程序可以处理制表符分隔的表。例如:
|
|
按作者名称排序前一个示例的结果,然后按标题按字母顺序排序(如果同一作者有多个出版物):
|
|
不必总是重新键入一系列常见的后处理指令,经常使用的UNIX命令组合可以放在一个函数中,存储在别名文件(例如用户的.bash_profile)中,并按名称执行。 (以下两个函数现在作为脚本包含在EDirect软件中。)例如:
|
|
标题可以传递给一对这些UNIX别名命令:
|
|
生成一个单词出现次数表,按频率排序:
|
|
输出格式自定义
-pattern对象之间的换行符可以用-ret覆盖,字段之间的制表符可以用-tab替换。
-sep参数用于区分同一类型的多个元素,并独立于-tab参数控制它们的分隔。例如:
|
|
将基因的所有同义词组合成一个列,由竖线分隔:
|
|
-sep值也适用于以逗号分组的不相关元素项。否则,-tab值描述各个字段。
组或字段前面带有-pfx值,后跟-sfx值,这两个值最初都是空的。
可以使用-def参数标记缺少的数据值。例如:
|
|
在缺少指定元素的列中插入破折号。
Pubmed Article XML Records
PubmedArticle对象(对于-db pubmed)具有比DocumentSummary更详细的结构:
|
|
提供更多信息,包括作者姓名,日期和摘要:
|
|
使用此信息来创建新的xtract语句:
|
|
得出每个记录的所有作者的表格:
|
|
(请注意,“-element MedlineCitation/PMID”使用“父/子”构造来防止显示稍后可能在CommentsCorrections对象中出现的其他PMID项。)
如果合适,可以使用-first或-last参数代替-element。
XML集的探索
可以通过efetch直接检索单个PubmedArticle对象:
|
|
生成的XML具有作者,其中包含姓氏和首字母的单独字段:
|
|
在没有给出关于上下文的任何指导的情况下,带有“Initials”和“LastName”参数的-element语句:
|
|
将分别探索每个参数的当前记录,从而打印所有作者姓名首字母,后跟所有作者姓氏:
|
|
插入-block语句会重定向数据探索,以便一次考虑每个作者。后续元素语句仅查看当前作者的值:
|
|
恢复首字母和姓氏的正确关联:
|
|
添加-sep语句以替换组成员之间的常规选项卡,并使用逗号将两个参数(“Initials,LastName”)组合到一个组中:
|
|
导致更理想的作者姓名格式:
|
|
可以通过-position语句选择第一个或最后一个结构化对象:
|
|
结果如下:
探索单独的XML区域
可以在单个提取中使用多块语句来探索XML的不同区域。这将元素提取限制到所需的子区域,并允许消除具有相同名称的字段的歧义。
将独立字段与逗号组合允许将它们视为集合。通常用于分隔这些选项卡的选项可以替换为-sep参数:
|
|
这将生成一个表,允许轻松解析作者姓氏,计算作者的数量,并打印每个记录发布的日期,按作者计数对结果进行排序:
|
|
(请注意,PubDate对象可以以结构化形式存在:
|
|
(常常缺少Day字段)或字符串形式:
|
|
但不包含两种类型的混合,因此指令:
|
|
只会为输出一列。)
XML集中子集的嵌套探索
记录中的Medical Subject Headings(MeSH术语)可以分配小标题:
|
|
使用-block语句访问每个MeSH术语,并在-block中添加-subset语句,允许嵌套探索当前MeSH术语的子标题:
|
|
并创建一个带有相关子标题的MeSH术语列表:
|
|
属性的选择
MeSH术语和子标题字段实际上具有主要的主题属性:
|
|
可以选择“DescriptorName@MajorTopicYN”或“@MajorTopicYN”:
|
|
主要主题值放在每个MeSH术语或子标题之前:
|
|
结果可以由UNIX流编辑器“sed”处理:
|
|
显示主要(“已加星标的”MeSH术语)概念的星号:
|
|
以变量记录值
可以将值记录在变量中,然后根据需要多次显示。变量用连字符后跟一串大写字母或数字表示。变量“-PMID”在-element参数中称为“&PMID”。例如:
|
|
生成作者列表,每行的第一列中有PMID:
|
|
变量初始化
可以使用括号中的文字值初始化变量:
|
|
这可以用作占位符,以防止丢失数据移动表中的列,或者对输出格式进行额外控制:
|
|
处理下一条记录时,将重置所有变量。
条件处理
Xtract提供-if和-unless参数,按元素名称或名称加数据值进行过滤。例如:
|
|
将选择正好3位作者的论文并打印共同作者姓名:
|
|
使用-and和-or命令指定多个条件:
|
|
-else命令可以提供替代-element或-lbl指令,以便在不满足条件时运行:
|
|
parallel -if和-unless语句可用于为包含嵌套探索的替代条件提供更复杂的响应。